package com.foreknow.proxy.dyproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * JDK的动态代理
 *
 *
 */
public class CompanyInvocationHandler implements InvocationHandler {

    private SuperMarketAction superMarket;

    public CompanyInvocationHandler(SuperMarketAction superMarket) {
        this.superMarket = superMarket;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("使用动态代理在调用某个方法前要做的操作");
        Object result = method.invoke(superMarket,args); //通过反射获取到切入点(接口中的方法)
        System.out.println("使用动态代理在调用某个方法后要做的操作");
        return result;
    }
    //生成代理对象
    //    public static Object newProxyInstance(ClassLoader loader,
    //                                          Class<?>[] interfaces,
    //                                          InvocationHandler h)
    //            throws IllegalArgumentException
    //以上方法的参数说明：
    //ClassLoader loader 被代理对象的类的加载器
    //Class<?>[] interfaces 被代理对象的接口列表
    //InvocationHandler h 动态代理的核心处理程序
    public Object createProxy() {
        return Proxy.newProxyInstance(superMarket.getClass().getClassLoader(),
                superMarket.getClass().getInterfaces(),this);
    }
}
